/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.x3.purchasing.produk;

import com.x3.purchasing.account.Account;
import com.x3.purchasing.common.ClassConnection;
import com.x3.purchasing.kategori.Kategori;
import com.x3.purchasing.order.Order;
import com.x3.purchasing.order.OrderDetail;
import com.x3.purchasing.vendor.Vendor;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.jdbc.core.RowMapper;

/**
 *
 * @author kris
 */
public class ProdukDAOImpl implements ProdukDAO {

    public ProdukDAOImpl() {
        ClassConnection.getTransactionProxyFactoryBean().setTarget(this);
    }

    public void insert(Produk produk) throws Exception {
        String sql = "INSERT INTO produk(kode,nama,keterangan,keterangan_lengkap,harga_satuan,gambar, "
                + " kategori_id,vendor_id) VALUES(?,?,?,?,?,?,?,?)";
        PreparedStatement ps = ClassConnection.getJdbc().getDataSource().getConnection().prepareStatement(sql);
        ps.setString(1, produk.getKode());
        ps.setString(2, produk.getNama());
        ps.setString(3, produk.getKeterangan());
        ps.setString(4, produk.getKeteranganLengkap());
        ps.setDouble(5, produk.getHargaSatuan());
        ps.setBinaryStream(6, produk.getFileGambar(), 1024 * 10000);
        ps.setInt(7, produk.getKategori().getId());
        ps.setInt(8, produk.getVendor().getId());
        ps.execute();
        ps.close();
    }

    public void update(Produk produk) throws Exception {
        String sql = null;
        if (produk.getFileGambar() == null) {
            sql = "UPDATE produk SET kode=?, nama=?, keterangan=?, keterangan_lengkap=?, harga_satuan=?, kategori_id=?"
                    + "  WHERE id=?";
            PreparedStatement ps = ClassConnection.getJdbc().getDataSource().getConnection().prepareStatement(sql);
            ps.setString(1, produk.getKode());
            ps.setString(2, produk.getNama());
            ps.setString(3, produk.getKeterangan());
            ps.setString(4, produk.getKeteranganLengkap());
            ps.setDouble(5, produk.getHargaSatuan());
            ps.setInt(6, produk.getKategori().getId());
            ps.setInt(7, produk.getId());
            ps.execute();
            ps.close();
        } else {
            sql = "UPDATE produk SET kode=?, nama=?, keterangan=?, keterangan_lengkap=?, harga_satuan=?, kategori_id=?,"
                    + " gambar=? WHERE id=?";
            PreparedStatement ps = ClassConnection.getJdbc().getDataSource().getConnection().prepareStatement(sql);
            ps.setString(1, produk.getKode());
            ps.setString(2, produk.getNama());
            ps.setString(3, produk.getKeterangan());
            ps.setString(4, produk.getKeteranganLengkap());
            ps.setDouble(5, produk.getHargaSatuan());
            ps.setInt(6, produk.getKategori().getId());
            ps.setBinaryStream(7, produk.getFileGambar(), 1024 * 10000);
            ps.setInt(8, produk.getId());
            ps.execute();
            ps.close();
        }
    }

    public void delete(int id) throws Exception {
        String sql = "DELETE FROM produk WHERE id=?";
        ClassConnection.getJdbc().update(sql, new Object[]{id});
    }

    public Produk get(int id) throws Exception {
        String sql = "SELECT p.id,p.kode,p.nama,p.keterangan,p.keterangan_lengkap,p.gambar,p.harga_satuan, "
                + " k.id as kategori_id, k.nama as kategori_nama, v.id as vendor_id, v.nama as vendor_nama"
                + " FROM PRODUK p "
                + " INNER JOIN kategori k ON k.id = p.kategori_id "
                + " INNER JOIN vendor v ON v.id = p.vendor_id WHERE p.id = ?";
        PreparedStatement ps = ClassConnection.getJdbc().getDataSource().getConnection().prepareStatement(sql);
        ps.setInt(1, id);
        ResultSet rs = ps.executeQuery();
        Produk produk = new Produk();
        while (rs.next()) {
            Kategori kategori = new Kategori();
            kategori.setId(rs.getInt("kategori_id"));
            kategori.setNama(rs.getString("kategori_nama"));

            Vendor vendor = new Vendor();
            vendor.setId(rs.getInt("vendor_id"));
            vendor.setNama(rs.getString("vendor_nama"));

            produk.setId(rs.getInt("id"));
            produk.setKode(rs.getString("kode"));
            produk.setNama(rs.getString("nama"));
            produk.setKeterangan(rs.getString("keterangan"));
            produk.setKeteranganLengkap(rs.getString("keterangan_lengkap"));
            produk.setHargaSatuan(rs.getDouble("harga_satuan"));
            produk.setFileGambar(rs.getBinaryStream("gambar"));
            produk.setKategori(kategori);
            produk.setVendor(vendor);
        }
        rs.close();
        ps.close();
        return produk;
    }

    public List<Produk> getByKategori(int id, int start, int end) throws Exception {
        List<Produk> produks = new ArrayList<Produk>();
        String sql = "SELECT p.id,p.kode,p.nama,p.keterangan,p.keterangan_lengkap,p.gambar,p.harga_satuan, "
                + " k.id as kategori_id, k.nama as kategori_nama, v.id as vendor_id, v.nama as vendor_nama"
                + " FROM PRODUK p "
                + " INNER JOIN kategori k ON k.id = p.kategori_id "
                + " INNER JOIN vendor v ON v.id = p.vendor_id"
                + " WHERE k.id = ? ORDER BY p.id DESC ";
        System.out.println(sql);
        PreparedStatement ps = ClassConnection.getJdbc().getDataSource().getConnection().prepareStatement(sql);
        ps.setInt(1, id);
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            Kategori kategori = new Kategori();
            kategori.setId(rs.getInt("kategori_id"));
            kategori.setNama(rs.getString("kategori_nama"));

            Vendor vendor = new Vendor();
            vendor.setId(rs.getInt("vendor_id"));
            vendor.setNama(rs.getString("vendor_nama"));

            Produk produk = new Produk();
            produk.setId(rs.getInt("id"));
            produk.setKode(rs.getString("kode"));
            produk.setNama(rs.getString("nama"));
            produk.setKeterangan(rs.getString("keterangan"));
            produk.setKeteranganLengkap(rs.getString("keterangan_lengkap"));
            produk.setHargaSatuan(rs.getDouble("harga_satuan"));
            produk.setFileGambar(rs.getBinaryStream("gambar"));
            produk.setKategori(kategori);
            produk.setVendor(vendor);
            produks.add(produk);
        }
        rs.close();
        ps.close();
        return produks;
    }

    public List<Produk> gets(int idVendor) throws Exception {
        List<Produk> produks = new ArrayList<Produk>();
        String sql = "SELECT p.id,p.kode,p.nama,p.keterangan,p.keterangan_lengkap,p.gambar,p.harga_satuan, "
                + " k.id as kategori_id, k.nama as kategori_nama, v.id as vendor_id, v.nama as vendor_nama"
                + " FROM PRODUK p "
                + " INNER JOIN kategori k ON k.id = p.kategori_id "
                + " INNER JOIN vendor v ON v.id = p.vendor_id WHERE v.id = ?";
        PreparedStatement ps = ClassConnection.getJdbc().getDataSource().getConnection().prepareStatement(sql);
        ps.setInt(1, idVendor);
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            Kategori kategori = new Kategori();
            kategori.setId(rs.getInt("kategori_id"));
            kategori.setNama(rs.getString("kategori_nama"));

            Vendor vendor = new Vendor();
            vendor.setId(rs.getInt("vendor_id"));
            vendor.setNama(rs.getString("vendor_nama"));

            Produk produk = new Produk();
            produk.setId(rs.getInt("id"));
            produk.setKode(rs.getString("kode"));
            produk.setNama(rs.getString("nama"));
            produk.setKeterangan(rs.getString("keterangan"));
            produk.setKeteranganLengkap(rs.getString("keterangan_lengkap"));
            produk.setHargaSatuan(rs.getDouble("harga_satuan"));
            produk.setFileGambar(rs.getBinaryStream("gambar"));
            produk.setKategori(kategori);
            produk.setVendor(vendor);
            produks.add(produk);
        }
        rs.close();
        ps.close();
        return produks;
    }

    public List<Produk> gets() throws Exception {
        List<Produk> produks = new ArrayList<Produk>();
        String sql = "SELECT p.id,p.kode,p.nama,p.keterangan,p.keterangan_lengkap,p.gambar,p.harga_satuan, "
                + " k.id as kategori_id, k.nama as kategori_nama, v.id as vendor_id, v.nama as vendor_nama"
                + " FROM PRODUK p "
                + " INNER JOIN kategori k ON k.id = p.kategori_id "
                + " INNER JOIN vendor v ON v.id = p.vendor_id ORDER BY p.id DESC";
        PreparedStatement ps = ClassConnection.getJdbc().getDataSource().getConnection().prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            Kategori kategori = new Kategori();
            kategori.setId(rs.getInt("kategori_id"));
            kategori.setNama(rs.getString("kategori_nama"));

            Vendor vendor = new Vendor();
            vendor.setId(rs.getInt("vendor_id"));
            vendor.setNama(rs.getString("vendor_nama"));

            Produk produk = new Produk();
            produk.setId(rs.getInt("id"));
            produk.setKode(rs.getString("kode"));
            produk.setNama(rs.getString("nama"));
            produk.setKeterangan(rs.getString("keterangan"));
            produk.setKeteranganLengkap(rs.getString("keterangan_lengkap"));
            produk.setHargaSatuan(rs.getDouble("harga_satuan"));
            produk.setFileGambar(rs.getBinaryStream("gambar"));
            produk.setKategori(kategori);
            produk.setVendor(vendor);
            produks.add(produk);
        }
        rs.close();
        ps.close();
        return produks;
    }

    public List<Produk> gets(int start, int end) throws Exception {
        List<Produk> produks = new ArrayList<Produk>();
        String sql = "SELECT p.id,p.kode,p.nama,p.keterangan,p.keterangan_lengkap,p.gambar,p.harga_satuan, "
                + " k.id as kategori_id, k.nama as kategori_nama, v.id as vendor_id, v.nama as vendor_nama"
                + " FROM PRODUK p "
                + " INNER JOIN kategori k ON k.id = p.kategori_id "
                + " INNER JOIN vendor v ON v.id = p.vendor_id"
                + " ORDER BY p.id DESC LIMIT 5";
        PreparedStatement ps = ClassConnection.getJdbc().getDataSource().getConnection().prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            Kategori kategori = new Kategori();
            kategori.setId(rs.getInt("kategori_id"));
            kategori.setNama(rs.getString("kategori_nama"));

            Vendor vendor = new Vendor();
            vendor.setId(rs.getInt("vendor_id"));
            vendor.setNama(rs.getString("vendor_nama"));

            Produk produk = new Produk();
            produk.setId(rs.getInt("id"));
            produk.setKode(rs.getString("kode"));
            produk.setNama(rs.getString("nama"));
            produk.setKeterangan(rs.getString("keterangan"));
            produk.setKeteranganLengkap(rs.getString("keterangan_lengkap"));
            produk.setHargaSatuan(rs.getDouble("harga_satuan"));
            produk.setFileGambar(rs.getBinaryStream("gambar"));
            produk.setKategori(kategori);
            produk.setVendor(vendor);
            produks.add(produk);
        }
        rs.close();
        ps.close();
        return produks;
    }

    public int countKategori(int id) throws Exception {
        String sql = "SELECT COUNT(p.id) as jumlah FROM produk p "
                + " INNER JOIN kategori k ON k.id = p.kategori_id  "
                + " INNER JOIN vendor v ON v.id = p.vendor_id WHERE k.id = ?";
        PreparedStatement ps = ClassConnection.getJdbc().getDataSource().getConnection().prepareStatement(sql);
        ps.setInt(1, id);
        ResultSet rs = ps.executeQuery();
        int jumlah = 0;
        while (rs.next()) {
            jumlah = rs.getInt("jumlah");
        }
        return jumlah;
    }

    public List<Produk> getOrderByVendor(int idVendor) {
        List<Produk> produks = new ArrayList<Produk>();
        String sql = "SELECT p.id, p.nama,p.kode,p.gambar,d.id as order_detail_id FROM vendor v "
                + " INNER JOIN produk p ON p.vendor_id = v.id "
                + " INNER JOIN detail_order d ON d.produk_id = p.id WHERE v.id = ?";
        PreparedStatement ps;
        try {
            ps = ClassConnection.getJdbc().getDataSource().getConnection().prepareStatement(sql);
            ps.setInt(1, idVendor);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                OrderDetail orderDetail = new OrderDetail();
                orderDetail.setId(rs.getInt("order_detail_id"));

                Produk produk = new Produk();
                produk.setId(rs.getInt("id"));
                produk.setKode(rs.getString("kode"));
                produk.setNama(rs.getString("nama"));
                produk.setFileGambar(rs.getBinaryStream("gambar"));
                produk.setOrderDetail(orderDetail);
                produks.add(produk);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ProdukDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return produks;
    }
}
